package com.legendframework.core.ioc;

import com.legendframework.core.ioc.exception.BeansException;

/**
 * Bean工厂
 */
public interface BeansFactory {

    /**
     * 返回指定Bean的实例
     * @param name Bean的名称
     * @return 对应的Bean
     * @throws NoSuchBeanDefinitionException 如果没有找到这个Bean
     * @throws BeansException 其他Bean逻辑失败异常
     */
    Object getBean(String name) throws BeansException;

    /**
     * 获取指定Bean实例并按照指定的类型返回
     * 请确保Bean能够强制转换为传入的 requiredType 类型
     *
     * @param name Bean的名称
     * @param requiredType 返回的类型
     * @return 对应的Bean
     * @throws NoSuchBeanDefinitionException 如果没有找到这个Bean
     * @throws BeanNotOfRequiredTypeException 类型错误异常
     * @throws BeansException 其他Bean逻辑失败异常
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 获取指定Bean实例并按照指定的类型返回
     * 请确保Bean的这个requiredType类型下只有唯一一个Bean实例
     *
     * @param requiredType 查找的Bean类型
     * @return 对应的Bean
     * @throws NoSuchBeanDefinitionException 如果没有找到这个Bean
     * @throws BeanNotOfRequiredTypeException 类型错误异常
     * @throws NoUniqueBeanDefinitionException 实例不唯一异常
     * @throws BeansException 其他Bean逻辑失败异常
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;
}
